using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Xna.Framework.Media;
using DiceRollerModel;

namespace DiceRoller
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Box Screen;

        //Dice
        Texture2D dieImage;
        List<Die> Dice;


        Button RollButton;
        Button ClearButton;
        Button GenerateDieButton;

        

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";

            graphics.PreferredBackBufferWidth = 480;
            graphics.PreferredBackBufferHeight = 800;

            // Frame rate is 30 fps by default for Windows Phone.
            TargetElapsedTime = TimeSpan.FromTicks(333333);
        }
        
        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here
            RollButton = new Button();
            ClearButton = new Button();
            GenerateDieButton = new Button();
            Screen = new Box();
            Screen.Height = 600;
            Screen.Width = 480;
            Screen.X = 0;
            Screen.Y = 0;
            ClearButton.ButtonPushedEventHandler += ClearDice;
            GenerateDieButton.ButtonPushedEventHandler += GenerateDice;
            
            Dice = new List<Die>();

         //   dSixDie = new Die();
         //   RollButton.ButtonPushedEventHandler += dSixDie.Roll;
            
            base.Initialize();
        }

        private void ClearDice()
        {
            Dice.Clear();
        }
        private Random r = new Random();
        private void GenerateDice()
        {
            Die newDie = new Die();
            newDie.Texture = dieImage;
            bool intersects = true;
            while (intersects)
            {
                intersects = false;
                newDie.Location = new Rectangle(r.Next(Screen.Width - Die.Width), r.Next(Screen.Height - Die.Width), Die.Width, Die.Width);
                newDie.TextureWindow = new Rectangle(0, 0, 67, 67);
                foreach (Die d in Dice)
                {
                    intersects |= newDie.Location.Intersects(d.Location);
                }
            }
           
            Dice.Add(newDie);
            RollButton.ButtonPushedEventHandler += newDie.Roll;
        }

        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
            RollButton.DepressedTexture= Content.Load<Texture2D>("RollButton");
            RollButton.PressedTexture = Content.Load<Texture2D>("RollButtonMouseOver");
            RollButton.Rect = new Rectangle(spriteBatch.GraphicsDevice.Viewport.Width / 2 - (RollButton.PressedTexture.Width / 2), spriteBatch.GraphicsDevice.Viewport.Height - RollButton.PressedTexture.Height, RollButton.PressedTexture.Width, RollButton.PressedTexture.Height);

            ClearButton.Rect = new Rectangle(0, spriteBatch.GraphicsDevice.Viewport.Height - RollButton.PressedTexture.Height - 100, 190, 75);
            GenerateDieButton.Rect = new Rectangle(280, spriteBatch.GraphicsDevice.Viewport.Height - RollButton.PressedTexture.Height - 100, 190, 75);
            
            ClearButton.DepressedTexture = Content.Load<Texture2D>("ClearButton");
            ClearButton.PressedTexture = Content.Load<Texture2D>("ClearMouseOver");
            GenerateDieButton.DepressedTexture = Content.Load<Texture2D>("GenDice");
            GenerateDieButton.PressedTexture = Content.Load<Texture2D>("GenDiceMouseOver");
            dieImage = Content.Load<Texture2D>("DiceSheet");
          //  dSixDie.Texture = dieImage;
         //   dSixDie.Location = new Rectangle(spriteBatch.GraphicsDevice.Viewport.Width / 2 - (dSixDie.Texture.Width / 2), spriteBatch.GraphicsDevice.Viewport.Height / 2 - (dSixDie.Texture.Height / 2), dSixDie.Texture.Width, dSixDie.Texture.Height);
            // TODO: use this.Content to load your game content here
        }

        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }
        
        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
            TouchCollection touches = TouchPanel.GetState();
            // TODO: Add your update logic here
            RollButton.HandleButtonPresses(touches);
            GenerateDieButton.HandleButtonPresses(touches);
            ClearButton.HandleButtonPresses(touches);

            //dSixDie.UpdateLocation(Screen, Dice);
            List<Die> temp = new List<Die>(Dice);
           // temp.Add(dSixDie);
            foreach (Die d in Dice)
            {
                d.UpdateLocation(Screen, temp);
            }

            base.Update(gameTime);
        }

        

        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.DarkGreen);
            spriteBatch.Begin();

            DrawDice();

            RollButton.DrawButton(spriteBatch);
            ClearButton.DrawButton(spriteBatch);
            GenerateDieButton.DrawButton(spriteBatch);
            
            spriteBatch.End();
            base.Draw(gameTime);
        }

        private void DrawDice()
        {
            //spriteBatch.Draw(dSixDie.Texture, dSixDie.Location, Color.White);
            foreach(Die d in Dice)
            {
                
                spriteBatch.Draw(d.Texture, d.Location, d.TextureWindow, Color.White);
            }
        }
    }
}
